"""
执行精确的浮点数运算

问题：
    你需要对浮点数执行精确的计算操作，并且不希望有任何小误差的出现。
解决问题：
    浮点数的一个普遍问题是它们并不能精确的表示十进制数。
    这些错误是由底层CPU和IEEE 754标准通过自己的浮点单位去执行算术时的特征。
    由于Python的浮点数据类型使用底层表示存储数据，因此你没办法去避免这样的误差。
    如果你想更加精确(并能容忍一定的性能损耗)，你可以使用 decimal 模块。
    在真实世界中很少会要求精确到普通浮点数能提供的17位精度。
    decimal 模块主要用在涉及到金融的领域。
"""

import math
from decimal import Decimal


def use_float():
    x = 1.2
    y = 2.1
    print(x * y == 2.52)
    # 注意：
    #   在python3.5.4上测试，小数字时，没发现有误差，可能python本身对float进行过优化。
    # 输出结果：
    """
    True
    """


def use_decimal():
    x = Decimal("1.2")
    y = Decimal("2.1")
    print((x * y) == Decimal("2.52"))
    # 输出结果：
    """
    True
    """


def use_sum():
    nums = [1.23e+18, 1, -1.23e+18]
    print(sum(nums))
    print(math.fsum(nums))
    # 存在误差
    # 输出结果：
    """
    0.0
    1.0
    """


if __name__ == '__main__':
    use_float()
    use_decimal()
    use_sum()
